package com.rasenhund.android.grecorder.activity;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.rasenhund.android.grecorder.R;
import com.rasenhund.android.grecorder.common.Const;
import com.rasenhund.android.grecorder.dao.RecordDao;
import com.rasenhund.android.grecorder.helper.DbHelper;
import com.rasenhund.android.grecorder.schema.Record;

/**
 * 履歴詳細、編集画面
 */
public class HistoryDetailActivity extends BaseActivity {
    // public class HistoryDetailActivity extends FragmentActivity {
    @SuppressWarnings("unused")
    private static final String TAG = HistoryDetailActivity.class.getSimpleName();
    private final HistoryDetailActivity self = this;

    static final int DIALOG_DELETE_CONFIRM = 1;

    static final int MODE_DETAIL_VIEW = 1; // 表示モード
    static final int MODE_DETAIL_EDIT = 2; // 編集モード

    Record mRecord = null;
    int mMode = MODE_DETAIL_VIEW;

    // 軍属
    TextView mTxtArmy = null;
    LinearLayout mLayoutArmy = null;
    CheckBox mChkEfsf = null;
    CheckBox mChkPoz = null;

    // メモ
    TextView mTxtMemoView = null;
    EditText mTxtMemoEdit = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
        setContentView(R.layout.history_detail);

        Intent intent = getIntent();
        long lRowId = intent.getLongExtra(Const.KEY.KEY_ROWID, -1);

        if (lRowId != -1) {

            DbHelper dbHelper = new DbHelper(self);
            SQLiteDatabase db = dbHelper.getWritableDatabase();
            RecordDao dao = new RecordDao(db);

            mRecord = dao.selectAt((int) lRowId);

            db.close();

            if (mRecord == null) {
                finish();
            }

        }

        // ヘッダ
        mTxtArmyEfsf = (TextView) findViewById(R.id.txtArmy_Efsf);
        mTxtArmyPoz = (TextView) findViewById(R.id.txtArmy_Poz);

        // 登録日
        TextView txtDate = (TextView) findViewById(R.id.txtDate);
        txtDate.setText(mRecord.getInsertDate());

        // 軍属
        mTxtArmy = (TextView) findViewById(R.id.txtArmy);
        mTxtArmy.setText(Const.getArmyNm(self, mRecord.getArmyCd()));

        mLayoutArmy = (LinearLayout) findViewById(R.id.layoutArmy);

        mChkEfsf = (CheckBox) findViewById(R.id.chkArmy_Efsf);
        mChkEfsf.setOnCheckedChangeListener(chkEfsf_OnCheckedChangeListener);

        mChkPoz = (CheckBox) findViewById(R.id.chkArmy_Poz);
        mChkPoz.setOnCheckedChangeListener(chkPoz_OnCheckedChangeListener);

        // 登録されている軍属をチェック
        switch (mRecord.getArmyCd()) {
            case Const.ARMY.EFSF:
                mChkEfsf.setChecked(true);
                break;
            case Const.ARMY.POZ:
                mChkPoz.setChecked(true);
                break;
        }

        // ステージ
        TextView txtStage = (TextView) findViewById(R.id.txtStage);
        txtStage.setText(Const.getStageNm(self, mRecord.getStageCd()));

        // カテゴリ
        TextView txtCategory = (TextView) findViewById(R.id.txtCategory);
        txtCategory.setText(Const.getCategoryNm(self,
                mRecord.getCategoryCd()));

        // 結果
        TextView txtResult = (TextView) findViewById(R.id.txtResult);
        txtResult.setText(Const.getResultNm(self, mRecord.getResultCd()));

        // メモ(表示用)
        mTxtMemoView = (TextView) findViewById(R.id.txtMemoView);
        mTxtMemoView.setText(mRecord.getMemo());

        // メモ(編集用)
        mTxtMemoEdit = (EditText) findViewById(R.id.txtMemoEdit);
        mTxtMemoEdit.setText(mRecord.getMemo());

        // 編集／保存ボタン
        ImageButton btnEditSave = (ImageButton) findViewById(R.id.btnEditSave);
        btnEditSave.setOnClickListener(btnEditSave_OnClickListener);

        // 削除ボタン
        ImageButton btnDelete = (ImageButton) findViewById(R.id.btnDelete);
        btnDelete.setOnClickListener(btnDelete_OnClickListener);

    }

    @Override
    protected void onResume() {
        super.onResume();

        // 軍属に応じてヘッダを変更
        setArmyHeaderVisibility(mArmyCd);

    }

    @Override
    protected Dialog onCreateDialog(int id) {

        switch (id) {
            case DIALOG_DELETE_CONFIRM:

                AlertDialog.Builder builder = null;
                builder = new AlertDialog.Builder(self);
                builder.setMessage(getStr(R.string.msg_confirm_delete));
                builder.setPositiveButton(getStr(R.string.msg_yes),
                        deleteConfirm_PositiveButton_OnClickListener);
                builder.setNegativeButton(getStr(R.string.msg_no),
                        deleteConfirm_NegativeButton_OnClickListener);

                return builder.create();

        }

        return null;

    }

    /********************
     * EventListener
     ********************/
    /**
     * 編集／保存ボタン押下時のイベントリスナ
     */
    private final OnClickListener btnEditSave_OnClickListener = new OnClickListener() {

        @Override
        public void onClick(View v) {

            switch (mMode) {
                case MODE_DETAIL_VIEW: // 表示モード
                    
                    // 編集用項目を可視化、ラベルを非表示に
                    
                    // 軍属
                    mTxtArmy.setVisibility(View.GONE);
                    mLayoutArmy.setVisibility(View.VISIBLE);

                    // メモ
                    mTxtMemoView.setVisibility(View.GONE);
                    mTxtMemoEdit.setVisibility(View.VISIBLE);

                    ImageButton btnEditSave = (ImageButton) findViewById(R.id.btnEditSave);
                    btnEditSave.setImageResource(android.R.drawable.ic_menu_save);

                    mMode = MODE_DETAIL_EDIT;

                    break;

                case MODE_DETAIL_EDIT: // 編集モード

                    // 更新処理を実行
                    if (update()) {

                        String sMsg = getStr(R.string.msg_save_complete);
                        Toast.makeText(self, sMsg, Toast.LENGTH_SHORT).show();

                        finish();

                    }

                    break;

            }

        }
        
    };

    /**
     * 削除ボタン押下時のイベントリスナ
     */
    private final OnClickListener btnDelete_OnClickListener = new OnClickListener() {

        @Override
        public void onClick(View v) {

            showDialog(DIALOG_DELETE_CONFIRM);

        }

    };

    /**
     * 削除確認ダイアログ OKボタン押下時のイベントリスナ
     */
    private final DialogInterface.OnClickListener deleteConfirm_PositiveButton_OnClickListener = new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {

            // 削除処理を実行
            if (mRecord != null) {
                if (deleteAt((int) mRecord.getRowId())) {
                    String sMsg = getStr(R.string.msg_delete_complete);
                    Toast.makeText(self, sMsg, Toast.LENGTH_SHORT).show();

                    finish();
                }
            }

        }
    };

    /**
     * 削除確認ダイアログ キャンセルボタン押下時のイベントリスナ
     */
    private final DialogInterface.OnClickListener deleteConfirm_NegativeButton_OnClickListener = new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {

            // ダイアログのキャンセル
            dialog.cancel();

        }
    };

    /**
     * 地球連邦軍 チェックボックス変更時のイベントリスナ
     */
    private OnCheckedChangeListener chkEfsf_OnCheckedChangeListener = new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            if (isChecked) {

                // ジオンがチェックされていたら外す
                if (mChkPoz.isChecked()) {
                    mChkPoz.setChecked(false);
                }

            }

        }

    };

    /**
     * ジオン公国軍 チェックボックス変更時のイベントリスナ
     */
    private OnCheckedChangeListener chkPoz_OnCheckedChangeListener = new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            if (isChecked) {

                // 連邦がチェックされていたら外す
                if (mChkEfsf.isChecked()) {
                    mChkEfsf.setChecked(false);
                }

            }

        }

    };

    /********************
     * Method
     ********************/

    /**
     * 更新処理
     */
    private boolean update() {

        // 編集項目からデータを取得

        // メモの取得
        String sMemo = mTxtMemoEdit.getText().toString();

        // 軍属コードの取得
        int iArmyCd = 0;
        if (mChkEfsf.isChecked()){
            iArmyCd = Const.ARMY.EFSF;
        } else if (mChkPoz.isChecked()) {
            iArmyCd = Const.ARMY.POZ;
        }
        
        DbHelper dbHelper = null;
        SQLiteDatabase db = null;

        int iRet;

        try {

            dbHelper = new DbHelper(self);
            db = dbHelper.getWritableDatabase();
            RecordDao dao = new RecordDao(db);

            // 入力値を反映
            mRecord.setMemo(sMemo);
            mRecord.setArmyCd(iArmyCd);

            // 更新処理を実行
            iRet = dao.update(mRecord);

        } finally {
            if (db.isOpen()) {
                db.close();
            }
        }

        if (iRet == 0) {
            return false;
        }

        return true;

    }

    /**
     * 削除処理
     * 
     * @param rowId
     */
    private Boolean deleteAt(int rowId) {

        DbHelper dbHelper = null;
        SQLiteDatabase db = null;

        int iRet;

        try {

            dbHelper = new DbHelper(self);
            db = dbHelper.getWritableDatabase();
            RecordDao dao = new RecordDao(db);

            iRet = dao.deleteAt(rowId);

        } finally {
            if (db.isOpen()) {
                db.close();
            }
        }

        if (iRet == 0) {
            return false;
        }

        return true;

    }

}
